Lightweight Higher-kinded Polymorphism
高階型の無い型システムにおいて高階型をエンコードする方法。
defunctionalizationを応用して、HKTの高階型を関数、型適用を関数適用にそのまま当てはめる。
code:ocaml
(* 文献1より引用 *)
(* 型適用を表す型 'f 'a === ('a, 'f) app *)
type ('a, 'f) app
(* * -> * を表す型用モジュール *)
module type Newtype1 = sig
type 'a s (* 元のOCaml世界の1引数型コンストラクタ 'a list, 'a option, etc. *)
type t (* HKT世界の(高階)型 List.t : * -> * *)
val inj: 'a s -> ('a, t) app
val prj: ('a, t) app -> 'a s
end
(* HKT用ファンクタ *)
module Newtype1(T: sig type 'a t end) : Newtype1 with type 'a s = 'a T.t
module List = Newtype1(struct type 'a t = 'a list end)
fp-tsにおける高階型
fp-tsではHKTというinterfaceが用意されている。作者がOptionを題材に使い方を説明している。 TS的にはかなりいい線行ってると思うがそこそこつらい、早く、早くfirst-class modulesを…
参考文献
1: Yallop, Jeremy, and Leo White. "Lightweight higher-kinded polymorphism." International Symposium on Functional and Logic Programming. Springer, Cham, 2014.